home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSXSRC.LZH / PICBTN_D.S < prev    next >
Text File  |  1995-03-20  |  7KB  |  294 lines

  1. *==============================================*
  2. *
  3. *    
  4. *     ピクチャボタン定義関数 rel.0.D
  5. *           By
  6. *  You Utzse@DennouMagicalTeam@Mankaiseisakujo
  7. *          1994-1995
  8. *==============================================*
  9. .include    SXCALL.MAC
  10. .include    DOSCALL.MAC
  11. .include    HASMACRO.MAC
  12. *==============================================*
  13. *だいたいラジオボタンと同じような働きをする
  14. *コントロール定義関数です。
  15. *違いは、全てをPAT4で構成してあることです。
  16. *PAT3,PAT4のパターンはリソースで持たせます。
  17. *
  18. *パターンのリソースハンドルを以下のように
  19. *固定ワークに書き込みます
  20. *
  21. *
  22. *BTTNPAT:    dc.l    1    *インアクティブ時
  23. *        dc.l    1    *アクティブでOFF時
  24. *        dc.l    1    *アクティブでON時
  25. *        dc.l    1    *強調表示
  26. *
  27. *CMOpen時に、cUserにはそのテーブルの先頭アドレス
  28. *(ここではBTTNPATです)を与え、さらに、
  29. *
  30. *    最小値= 0 、
  31. *    最大値= 1
  32. *
  33. *を指定してコントロールをオープンします
  34. *cUserを参照するのはオープン時のみです。
  35. *また、cDefDataを使ってはいけません。
  36. *
  37. *パターンのサイズは同一でないと、みっともないです。
  38.  
  39. *HAS 2.50以上でアセンブル可能です。
  40. *
  41. *謝辞
  42. *
  43. *沖 勝さんのmoCDEF.rを参考にさせていただきました。
  44. *また、SYSTEM.LBを解析して参考にしています。
  45. *==============================================*
  46. *スタック補正なしSXコールマクロ
  47. SX    macro    num,cnt
  48.     .dc.w    num
  49. .endm
  50. *スタック補正付きSXコールマクロ
  51. SXCALL    macro    num,cnt
  52.         dc.w    num
  53. .if    cnt<9
  54.     .if    cnt<>0
  55.         addq.l    #cnt,sp
  56.     .endif
  57. .else
  58.         lea    cnt(sp),sp
  59. .endif
  60. .endm
  61. *==============================================*
  62. G_WHITE        equ    8    * 白
  63. G_LGRAY        equ    9    * 明るいグレー
  64. G_DGRAY        equ    10    * 暗いグレー
  65. G_BLACK        equ    10    * 黒
  66.  
  67. C_INBTTN    equ    10
  68. *==============================================*
  69. rectangle    =    8
  70. .offset 0
  71. cNext:          ds.l    1        * 次のコントロールへの handle    0
  72. cWindow:        ds.l    1        * 自分が書かれるウィンドウへの pointer    4
  73. cRect:          ds.b    rectangle    * 自分の大きさを示す四角形    8
  74. cVisible:       ds.b    1        * 可視/不可視属性    16
  75. cHilite:        ds.b    1        * 強調表示/使用不可    17
  76. cValue:         ds.w    1        * 現在値    18
  77. cMin:           ds.w    1        * 最小値    20
  78. cMax:           ds.w    1        * 最大値    22
  79. cDef:           ds.l    1        * コントロール定義関数への handle    24
  80. cOption:        ds.w    1        * コントロールのオプション    28
  81. cDefData:       ds.l    1        * 定義関数のデータ    30
  82. cProc:          ds.l    1        * DRAG 時に呼び出される手続き    34
  83. cUser:          ds.l    1        * ユーザー用のワークエリア    38
  84. *cTitle:         ds.b    LASCII        * コントロールのタイトル LASCII    42
  85. *control:
  86. .text
  87. *==============================================*
  88. *
  89. * CDEF ENTRY
  90. *
  91. *
  92. .offset    0
  93.         ds.l    2
  94. optcode:    ds.w    1
  95. ctrlHdl:    ds.l    1
  96. command:    ds.w    1
  97. param:        ds.l    1
  98. .text
  99. *==============================================*
  100. CDEF_START:
  101.     link    a6,#0
  102.     moveq    #0,d0
  103.     movem.l    d1-d7/a1-a5,-(sp)
  104.  
  105.         move.l    param(a6),-(sp)
  106.         move.w    command(a6),-(sp)
  107.         move.l    ctrlHdl(a6),-(sp)
  108.         move.w    optcode(a6),-(sp)
  109.         BSR    cmdBranch
  110.         lea.l    12(sp),sp
  111.  
  112.     movem.l    (sp)+,d1-d7/a1-a5
  113.     unlk    a6
  114.     rts
  115. *==============================================*
  116. *
  117. * CDEF BRANCH TO COMMAND
  118. *
  119. *
  120. .offset    0
  121. ds.l    1            *sp
  122. optcode2:    ds.w    1
  123. ctrlHdl2:    ds.l    1
  124. command2:    ds.w    1
  125. param2:        ds.l    1
  126. .text
  127. *----------------------------------------------*
  128. cmdBranch:
  129.         move.l    ctrlHdl2(sp),d2        *コントロールレコードへのハンドル
  130.         move.l    param2(sp),d1        *コマンドごとに違う
  131.         move.w    command2(sp),d0        *コマンドナンバー
  132.         moveq    #8,d3            *コマンドの上限
  133.         cmp.w    d3,d0
  134.         bhi    Break
  135.         add.l    d0,d0
  136.         move.w    jmptbl(pc,d0.l),d3
  137.         jmp    jmptbl(pc,d3.w)
  138.  
  139. jmptbl:
  140.     dc.w    drawctrl-jmptbl            *コントロール描画ルーチン
  141.     dc.w    where_ctrl-jmptbl        *コントロール内にポイントがあるか
  142.     dc.w    calc_ctrl-jmptbl        *リージョン計算
  143.     dc.w    initctrl-jmptbl            *コントロール初期化
  144.     dc.w    Break-jmptbl
  145.     dc.w    Break-jmptbl
  146.     dc.w    Break-jmptbl
  147.     dc.w    Break-jmptbl
  148.     dc.w    Break-jmptbl
  149.  
  150. Break:
  151.     moveq    #0,d0
  152. Break2:
  153.     rts
  154. *==============================================*
  155. *
  156. *    COMMAND [DRAW]
  157. *
  158. *----------------------------------------------*
  159. ofs    =    -16
  160. .offset    ofs
  161. dc_penmode:    ds.w    1
  162. dc_backcolor:    ds.w    1
  163. dc_forecolor:    ds.w    1
  164. dc_apage:    ds.w    1
  165. dc_rect:    ds.w    4
  166.  
  167. .text
  168. *----------------------------------------------*
  169. drawctrl:
  170.     link    a6,#ofs
  171.  
  172.         movea.l    d2,a3            *d2=a3=ctrlHdl
  173.         move.l    d1,a5            *d1=param
  174.  
  175.         movea.l    (a3),a0            *ctrlPtr
  176.         movea.w    cOption(a0),a4        *cRec_option
  177.         movea.l    4(a0),a1        *winPtr
  178.         tst.b    cVisible(a0)        *ctrl Visible?
  179.         beq    draw_end        *if hidden 
  180.         tst.b    $42(a1)            *win Visible?
  181.         beq    draw_end        *if hidden 
  182.  
  183.         moveq    #%0111,d0        *3PAGE
  184.         move.w    d0,-(sp)
  185.         SX    __GMAPage,2
  186.         move.w    d0,dc_apage(a6)
  187.  
  188.         movea.l    (a3),a1
  189.  
  190.     ifeq    <cmpi.b    #-1,cHilite(a1)>
  191.         moveq    #0,d1                *INACTIVE=offset 0
  192.     elseifne <cmpi.b #$b,cHilite(a1)>
  193.         ifne <tst.w cValue(a1)>
  194.             ifne    <cmpi.b    #$b,cHilite(a1)>
  195.                 moveq    #8,d1        *ON=offset 8
  196.             elseifne <cmpi.b #$b,$13(a5)>
  197.                 moveq    #8,d1
  198.             else
  199.                 unlk    a6
  200.                 bra    Break2
  201.                 
  202.             endif
  203.         else
  204.             ifne    <cmpi.b    #$b,cHilite(a1)>
  205.                 moveq    #4,d1        *OFF=offset 4
  206.             elseifne <cmpi.b #$b,$13(a5)>
  207.                 moveq    #4,d1
  208.             else
  209.                 unlk    a6
  210.                 bra    Break2
  211.                 
  212.             endif
  213.         endif
  214.     else                        *PARTCODE=offset 12
  215.         moveq    #12,d1
  216.     endif
  217.         move.l    cDefData(a1),a0        *a0=hdlTblTopAdr
  218.         add.w    d1,a0            *nowHdlptr
  219.         move.l    (a0),a0            *ImgHdl
  220.         move.l    (a0),a0            *NowRImgPtr
  221.  
  222.         move.l    cRect(a1),-(sp)        *POINT_T
  223.         pea    (a0)
  224.         SX    __GMPutRImg,8
  225.  
  226. picBtn_end:
  227.         move.w    dc_apage(a6),-(sp)
  228.         SX    __GMAPage,2
  229. draw_end:
  230.         moveq    #0,d0
  231.  
  232.     unlk    a6                *スタックは一気に補正
  233.     bra    Break2
  234. *==============================================*
  235. *
  236. *    COMMAND [WHERE]
  237. *
  238. *==============================================*
  239. where_ctrl:
  240.         movea.l    d2,a5            *hdl
  241.         movea.l    (a5),a0            *ctrlptr
  242.         cmpi.b    #-1,cHilite(a0)        *if inact branch
  243.         beq    Break            *partcode=0
  244.  
  245.         move.l    a0,d0            *ctrlptr
  246.         addq.w    #8,d0            *rectptr
  247.         move.l    d1,-(sp)        *pt
  248.         move.l    d0,-(sp)        *rect
  249.         SXCALL    __GMPtInRect,8
  250.         cmpi.w    #1,d0            *IN?
  251.         bne    Break            *partcode=0
  252.         moveq    #$b,d0            *partcode=11
  253.         bra    Break2
  254. *==============================================*
  255. *
  256. *    COMMAND [CALC]
  257. *
  258. *コントロールの占めるリージョンを返す
  259. *paramのHSBが立っていたら、THUMBのリージョンを
  260. *かえす(ないのでヌルリージョン)
  261. *
  262. *==============================================*
  263.  
  264. calc_ctrl:
  265.         tst.l    d1            *d1=param(rgnHdl)
  266.         bge    @f            *if not HSB =1 branch @@:
  267.  
  268.         move.l    d1,-(sp)        *rgnhdl
  269.         SXCALL    __GMNullRgn,4        *THUMBのリージョンを返す
  270.         bra    Break
  271. @@:
  272.         movea.l    d2,a1            *d2=cHdl
  273.         movea.l    (a1),a1            *ctrlptr
  274.         move.l    cRect(a1),-(sp)        *rectptr
  275.         move.l    d1,-(sp)        *rgnhdl
  276.         SXCALL    __GMRectRgn,8        *コントロールのリージョンを返す
  277.         bra    Break
  278. *==============================================*
  279. *
  280. *    COMMAND [INIT]
  281. *
  282. *CMOpen時に、cUserから渡されたものを、
  283. *レクタングルイメージへのハンドルとみなして
  284. *参照している。cUserを解放するために
  285. *定義関数用のワークにハンドルを移している
  286.  
  287. initctrl:
  288.         movea.l    d2,a0            *d2=ctrlHdl
  289.         movea.l    (a0),a0            *ptr
  290.         move.l    cUser(a0),cDefData(a0)    
  291.         bra    Break
  292.  
  293. .end    CDEF_START
  294.